कुशल और वृद्धिशील मॉड्यूल पार्सिंग के लिए जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर का अन्वेषण करें, जो वैश्विक फ्रंट-एंड विकास में क्रांति ला रहा है।
जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर: वृद्धिशील मॉड्यूल पार्सिंग का भविष्य
फ्रंट-एंड डेवलपमेंट के तेजी से विकसित हो रहे परिदृश्य में, दक्षता और प्रदर्शन सर्वोपरि हैं। जैसे-जैसे जावास्क्रिप्ट एप्लिकेशन की जटिलता बढ़ती है, तेज बिल्ड प्रक्रियाओं, अधिक प्रतिक्रियाशील डेवलपमेंट सर्वरों और छोटे प्रोडक्शन बंडलों की आवश्यकता और भी महत्वपूर्ण हो जाती है। इन कई प्रक्रियाओं के केंद्र में जावास्क्रिप्ट कोड की पार्सिंग होती है - मानव-पठनीय स्रोत टेक्स्ट को एक संरचित प्रतिनिधित्व में बदलना जिसे मशीनें समझ सकती हैं। परंपरागत रूप से, इसमें पूरी फ़ाइल को एक बार में पार्स करना शामिल है। हालांकि, एक नया प्रतिमान उभर रहा है: जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर्स। यह तकनीक वृद्धिशील पार्सिंग को सक्षम करके जावास्क्रिप्ट मॉड्यूल को संभालने के तरीके में क्रांति लाने का वादा करती है, जिससे प्रदर्शन में महत्वपूर्ण लाभ होता है और डेवलपर अनुभव में नाटकीय रूप से सुधार होता है।
पारंपरिक दृष्टिकोण: पूरी फ़ाइल पार्सिंग
भविष्य में गोता लगाने से पहले, वर्तमान स्थिति को समझना आवश्यक है। अधिकांश जावास्क्रिप्ट पार्सर, चाहे वे वेबपैक जैसे बंडलर्स द्वारा उपयोग किए जाते हों या बैबेल जैसे बिल्ड टूल्स द्वारा, एक पूरी स्रोत फ़ाइल लेते हैं, इसे मेमोरी में पढ़ते हैं, और फिर एक पूर्ण एब्स्ट्रैक्ट सिंटैक्स ट्री (एएसटी) का निर्माण करते हैं। एक एएसटी एक पेड़ जैसी डेटा संरचना है जो स्रोत कोड की वाक्यात्मक संरचना का प्रतिनिधित्व करती है। इस एएसटी को फिर विभिन्न परिवर्तनों, अनुकूलन और बंडलिंग कार्यों को करने के लिए ट्रैवर्स और हेरफेर किया जाता है।
हालांकि यह प्रभावी है, इस दृष्टिकोण की कुछ अंतर्निहित सीमाएँ हैं:
- प्रदर्शन की बाधाएं: बड़ी फ़ाइलों को पार्स करना समय लेने वाला हो सकता है, खासकर जब कई मॉड्यूल के साथ काम कर रहे हों। यह सीधे बिल्ड समय और डेवलपमेंट सर्वरों की प्रतिक्रियाशीलता को प्रभावित करता है।
- मेमोरी की खपत: पूरी फ़ाइलों को लोड और पार्स करने में काफी मेमोरी लग सकती है, जो संसाधन-बाधित वातावरण या बहुत बड़े कोडबेस को संसाधित करते समय एक चिंता का विषय हो सकता है।
- सूक्ष्मता की कमी: यदि किसी फ़ाइल का केवल एक छोटा सा हिस्सा बदलता है, तो भी पूरी फ़ाइल को फिर से पार्स करने और उसके एएसटी को फिर से बनाने की आवश्यकता होती है। यह वृद्धिशील अपडेट के लिए अक्षम है, जो विकास के दौरान एक सामान्य परिदृश्य है।
हजारों जावास्क्रिप्ट मॉड्यूल वाले एक बड़े एंटरप्राइज एप्लिकेशन पर विचार करें। एक अकेली फ़ाइल में एक छोटा सा बदलाव भी पूरे प्रोजेक्ट के लिए री-पार्सिंग और री-बंडलिंग संचालन की एक श्रृंखला शुरू कर सकता है, जिससे डेवलपर्स को अपने परिवर्तनों को ब्राउज़र में देखने के लिए निराशाजनक रूप से लंबा इंतजार करना पड़ता है। यह सिलिकॉन वैली के स्टार्टअप से लेकर यूरोप और एशिया की स्थापित तकनीकी कंपनियों तक, दुनिया भर के डेवलपर्स द्वारा सामना की जाने वाली एक सार्वभौमिक समस्या है।
स्ट्रीमिंग और वृद्धिशील पार्सिंग का आगमन
स्ट्रीमिंग की अवधारणा में डेटा को छोटे-छोटे टुकड़ों में संसाधित करना शामिल है जैसे ही यह उपलब्ध होता है, बजाय इसके कि पूरे डेटासेट के लोड होने की प्रतीक्षा की जाए। कोड पार्सिंग पर लागू होने पर, इसका मतलब है कि एक फ़ाइल को टुकड़े-टुकड़े करके संसाधित करना, और एएसटी को वृद्धिशील रूप से बनाना।
वृद्धिशील पार्सिंग इसे एक कदम आगे ले जाती है। हर बार खरोंच से शुरू करने के बजाय, एक वृद्धिशील पार्सर पिछले पार्सिंग परिणामों का लाभ उठा सकता है। जब किसी फ़ाइल को संशोधित किया जाता है, तो एक वृद्धिशील पार्सर विशिष्ट परिवर्तनों की पहचान कर सकता है और मौजूदा एएसटी को कुशलतापूर्वक अपडेट कर सकता है, बजाय इसके कि इसे पूरी तरह से त्याग दिया जाए और फिर से बनाया जाए। यह एक दस्तावेज़ को संपादित करने के समान है जहां सॉफ्टवेयर को केवल उन पैराग्राफों को फिर से प्रारूपित करने की आवश्यकता होती है जिन्हें बदला गया था, न कि पूरे दस्तावेज़ को।
जावास्क्रिप्ट के लिए कुशल वृद्धिशील पार्सिंग को लागू करने में मुख्य चुनौती भाषा की गतिशील प्रकृति और इसके व्याकरण की जटिलता रही है। हालांकि, पार्सर डिजाइन में हाल की प्रगति और बाइनरी एएसटी प्रारूपों का उदय वास्तव में प्रभावी समाधानों का मार्ग प्रशस्त कर रहा है।
बाइनरी एएसटी का वादा
परंपरागत रूप से, एएसटी को जावास्क्रिप्ट ऑब्जेक्ट्स का उपयोग करके मेमोरी में दर्शाया जाता है। हेरफेर के लिए सुविधाजनक होते हुए भी, ये इन-मेमोरी प्रतिनिधित्व शब्दशः और क्रमबद्ध या प्रसारित करने के लिए अक्षम हो सकते हैं। यहीं पर बाइनरी एएसटी काम आते हैं।
एक बाइनरी एएसटी एक एएसटी का एक क्रमबद्ध, संक्षिप्त प्रतिनिधित्व है। नेस्टेड गुणों वाले जावास्क्रिप्ट ऑब्जेक्ट के बजाय, यह एक बाइनरी प्रारूप है जिसे अधिक कुशलता से संग्रहीत या प्रसारित किया जा सकता है। यह कई फायदे प्रदान करता है:
- कम आकार: बाइनरी प्रारूप आमतौर पर अपने टेक्स्ट-आधारित या ऑब्जेक्ट-आधारित समकक्षों की तुलना में बहुत छोटे होते हैं।
- तेज सीरियलाइजेशन/डी-सीरियलाइजेशन: बाइनरी प्रारूप में और उससे रूपांतरण अक्सर जटिल जावास्क्रिप्ट ऑब्जेक्ट्स से निपटने की तुलना में तेज होता है।
- कुशल भंडारण: संक्षिप्त बाइनरी प्रतिनिधित्व डिस्क स्थान बचाते हैं।
- बेहतर कैश करने की क्षमता: बाइनरी एएसटी को अधिक प्रभावी ढंग से कैश किया जा सकता है, जिससे उपकरण बिना दोबारा पार्स किए पार्स किए गए कोड को जल्दी से पुनः प्राप्त कर सकते हैं।
प्रोटोकॉल बफ़र्स या मैसेजपैक जैसे बाइनरी सीरियलाइज़ेशन प्रारूपों के लोकप्रिय उदाहरण दक्षता के लिए बाइनरी प्रतिनिधित्व की शक्ति को प्रदर्शित करते हैं। इसे एएसटी पर लागू करने का मतलब है कि पार्स किए गए कोड को अधिक मशीन-अनुकूल और संक्षिप्त रूप में संग्रहीत किया जा सकता है।
जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर: तालमेल
असली शक्ति बाइनरी एएसटी और स्ट्रीमिंग/वृद्धिशील पार्सिंग के बीच तालमेल में निहित है। एक जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर का लक्ष्य है:
- स्रोत को स्ट्रीम करें: जावास्क्रिप्ट स्रोत फ़ाइल को टुकड़ों में पढ़ें।
- बाइनरी एएसटी को वृद्धिशील रूप से बनाएं: जैसे ही टुकड़े संसाधित होते हैं, एएसटी का एक संक्षिप्त बाइनरी प्रतिनिधित्व वृद्धिशील रूप से बनाएं या अपडेट करें।
- कैश और पुन: उपयोग करें: बाद में पुन: उपयोग के लिए बाइनरी एएसटी को स्टोर करें। यदि किसी फ़ाइल को संशोधित किया जाता है, तो केवल बदले हुए अनुभागों को फिर से पार्स करने की आवश्यकता होती है, और बाइनरी एएसटी के संबंधित भागों को अपडेट किया जाता है।
यह दृष्टिकोण पारंपरिक पार्सर्स की प्रदर्शन बाधाओं को सीधे संबोधित करता है:
- तेज बिल्ड: पूरी तरह से री-पार्सिंग से बचकर और कैश किए गए बाइनरी एएसटी का लाभ उठाकर, बिल्ड समय को काफी कम किया जा सकता है, खासकर वृद्धिशील बिल्ड के लिए।
- प्रतिक्रियाशील डेवलपमेंट सर्वर: डेवलपमेंट सर्वर एप्लिकेशन को बहुत तेजी से अपडेट कर सकते हैं, जिससे डेवलपर्स के लिए लगभग तात्कालिक फीडबैक लूप मिलता है।
- कम मेमोरी फुटप्रिंट: स्ट्रीमिंग और वृद्धिशील अपडेट के लिए अक्सर एक ही बार में पूरी फ़ाइलों को लोड करने और संसाधित करने की तुलना में कम मेमोरी की आवश्यकता होती है।
- कुशल कैशिंग: बाइनरी एएसटी कैशिंग के लिए आदर्श हैं, जिससे उपकरण पूर्व-पार्स किए गए कोड को जल्दी से परोस सकते हैं और केवल परिवर्तनों को संसाधित कर सकते हैं।
व्यावहारिक निहितार्थ और वास्तविक दुनिया के परिदृश्य
जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर्स का प्रभाव पूरे फ्रंट-एंड डेवलपमेंट इकोसिस्टम में महसूस किया जाएगा:
1. बेहतर डेवलपर अनुभव (डीएक्स)
सबसे तत्काल लाभ एक काफी सहज और तेज विकास वर्कफ़्लो होगा। एक ऐसे परिदृश्य की कल्पना करें जहां एक फ़ाइल को सहेजने और ब्राउज़र में परिवर्तनों को देखने में सेकंड या मिनटों के बजाय मिलीसेकंड लगते हैं। यह इन जैसी तकनीकों का वादा है:
- वाइट (Vite): वाइट प्रसिद्ध रूप से विकास के दौरान मूल ईएस मॉड्यूल का उपयोग करता है, जिससे सर्वर का कोल्ड स्टार्ट अत्यंत तेज होता है और हॉट मॉड्यूल रिप्लेसमेंट (एचएमआर) तत्काल होता है। हालांकि वाइट की वर्तमान पार्सिंग एक पूर्ण बाइनरी एएसटी स्ट्रीमिंग दृष्टिकोण नहीं हो सकती है, यह वृद्धिशील अपडेट और कुशल मॉड्यूल हैंडलिंग की भावना का प्रतीक है। भविष्य के संस्करण या साथी उपकरण और भी अधिक लाभ के लिए बाइनरी एएसटी का लाभ उठा सकते हैं।
- esbuild: अपनी अविश्वसनीय गति के लिए जाना जाने वाला, esbuild गो में लिखा गया है और जावास्क्रिप्ट को बहुत तेजी से संकलित करता है। हालांकि यह एक समर्पित जावास्क्रिप्ट पार्सर की तरह वृद्धिशील अपडेट के लिए मूल रूप से एक स्ट्रीमिंग बाइनरी एएसटी को उजागर नहीं करता है, इसके कुशल पार्सिंग और बंडलिंग के अंतर्निहित सिद्धांत अत्यधिक प्रासंगिक हैं।
- Next.js और अन्य फ्रेमवर्क: वेबपैक या वाइट जैसे बंडलर्स के शीर्ष पर बने फ्रेमवर्क को इन प्रदर्शन सुधारों का लाभ मिलेगा, जिससे उनके साथ विकास विश्व स्तर पर बहुत अधिक सुखद हो जाएगा।
मुंबई में एक बड़े रिएक्ट एप्लिकेशन पर काम करने वाले एक डेवलपर को बर्लिन के एक डेवलपर की तरह ही बिजली की तेजी से बिल्ड समय का अनुभव हो सकता है, जो भौगोलिक स्थिति या स्थानीय नेटवर्क स्थितियों की परवाह किए बिना विकास की गति के लिए समान अवसर प्रदान करता है।
2. अनुकूलित प्रोडक्शन बिल्ड
जबकि विकास की गति एक बड़ी जीत है, प्रोडक्शन बिल्ड को भी लाभ होने की संभावना है। अनुकूलित पार्सिंग और एएसटी हेरफेर से ये हो सकता है:
- तेज बंडलिंग: कोड स्प्लिटिंग, ट्री-शेकिंग और मिनिफिकेशन की प्रक्रिया को तेज किया जा सकता है।
- अधिक कुशल कोड जनरेशन: एक अच्छी तरह से संरचित एएसटी कोड जनरेशन चरण के दौरान अधिक परिष्कृत और प्रभावी अनुकूलन को सक्षम कर सकता है।
- बिल्ड सर्वर लोड में कमी: सीआई/सीडी पाइपलाइनों और बड़े पैमाने पर परिनियोजन के लिए, तेज बिल्ड का मतलब बिल्ड इंफ्रास्ट्रक्चर का अधिक कुशल उपयोग है, जिससे दुनिया भर की कंपनियों के लिए लागत बचती है।
3. उन्नत टूलिंग क्षमताएं
कुशल बाइनरी एएसटी की उपलब्धता नए और बेहतर टूलिंग के लिए दरवाजे खोलती है:
- वास्तविक समय में कोड विश्लेषण: स्थिर विश्लेषण, लिंटिंग, या टाइप चेकिंग करने वाले उपकरण वृद्धिशील एएसटी अपडेट द्वारा संचालित, आपके टाइप करते ही लगभग तत्काल प्रतिक्रिया के साथ काम कर सकते हैं।
- बुद्धिमान कोड संपादक: आईडीई बड़े प्रोजेक्ट्स में भी बिना किसी ध्यान देने योग्य अंतराल के अधिक परिष्कृत कोड पूर्णता, रिफैक्टरिंग सुझाव और त्रुटि हाइलाइटिंग की पेशकश कर सकते हैं। एक ऐसे आईडीई प्लगइन की कल्पना करें जो पृष्ठभूमि में आपके पूरे प्रोजेक्ट के एएसटी का विश्लेषण करता है, जैसे ही आप कोड करते हैं उसे वृद्धिशील रूप से अपडेट करता है, और एक पूर्ण बिल्ड के बराबर अंतर्दृष्टि प्रदान करता है लेकिन न्यूनतम ओवरहेड के साथ।
- संस्करण नियंत्रण एकीकरण: उपकरण संभावित रूप से कोड परिवर्तनों को एक सिमेंटिक स्तर पर समझने के लिए एएसटी डिफिंग का लाभ उठा सकते हैं, जो सरल टेक्स्ट डिफ्स से परे है।
4. नई जावास्क्रिप्ट सुविधाओं की क्षमता
जैसे-जैसे जावास्क्रिप्ट स्वयं नए सिंटैक्स और सुविधाओं के साथ विकसित होता है, एक मजबूत और कुशल पार्सिंग इंफ्रास्ट्रक्चर महत्वपूर्ण है। उन्नत पार्सिंग तकनीकें सक्षम कर सकती हैं:
- नए मानकों को तेजी से अपनाना: यदि उनका पार्सिंग इंफ्रास्ट्रक्चर अत्यधिक कुशल है तो उपकरण आगामी ECMAScript सुविधाओं का अधिक आसानी से समर्थन कर सकते हैं।
- प्रायोगिक सुविधा समर्थन: विकास में प्रायोगिक सुविधाओं को सक्षम करना प्रदर्शन का कम बोझ बन सकता है।
चुनौतियाँ और विचार
हालांकि संभावनाएं रोमांचक हैं, जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर्स को लागू करना और अपनाना चुनौतियों से रहित नहीं है:
- मानकीकरण: व्यापक रूप से अपनाने के लिए, एक मानकीकृत बाइनरी एएसटी प्रारूप अत्यधिक फायदेमंद होगा, ठीक उसी तरह जैसे JSON डेटा इंटरचेंज के लिए एक वास्तविक मानक बन गया है।
- टूलिंग इकोसिस्टम को अपनाना: प्रमुख बिल्ड टूल्स, बंडलर्स और ट्रांसपाइलर्स को इन नई पार्सिंग क्षमताओं को एकीकृत करने की आवश्यकता होगी। इसके लिए महत्वपूर्ण इंजीनियरिंग प्रयास और सामुदायिक सहमति की आवश्यकता है।
- कार्यान्वयन की जटिलता: एक मजबूत और प्रदर्शनकारी स्ट्रीमिंग और वृद्धिशील पार्सर विकसित करना, विशेष रूप से जावास्क्रिप्ट जैसी जटिल भाषा के लिए, एक महत्वपूर्ण तकनीकी उपक्रम है।
- त्रुटि संभालना: सिंटैक्स त्रुटियों को कुशलतापूर्वक संभालना और एक स्ट्रीमिंग और वृद्धिशील तरीके से स्पष्ट, कार्रवाई योग्य प्रतिक्रिया प्रदान करने के लिए सावधानीपूर्वक डिजाइन की आवश्यकता होती है।
- संगतता: मौजूदा जावास्क्रिप्ट कोडबेस और विभिन्न जावास्क्रिप्ट वातावरण (नोड.जेएस, ब्राउज़र) के साथ संगतता सुनिश्चित करना महत्वपूर्ण है।
प्रमुख खिलाड़ी और भविष्य की दिशाएँ
तेज जावास्क्रिप्ट पार्सर्स का विकास एक सतत प्रयास रहा है। इन जैसी परियोजनाएं:
- एकॉर्न (Acorn): एक व्यापक रूप से इस्तेमाल किया जाने वाला, तेज और मजबूत जावास्क्रिप्ट पार्सर।
- बैबेल का पार्सर (पूर्व में babylon): एक और शक्तिशाली पार्सर जो बैबेल की ट्रांसफॉर्मेशन पाइपलाइन की रीढ़ है।
- esbuild का पार्सर: गो में विकसित, esbuild का पार्सर अत्यधिक पार्सिंग गति का एक प्रमुख उदाहरण है।
- एसडब्ल्यूसी (SWC - स्पीडी वेब कंपाइलर): रस्ट में लिखा गया, एसडब्ल्यूसी का लक्ष्य बैबेल और वेबपैक का एक तेज विकल्प प्रदान करना है। इसका पार्सिंग इंजन इसके प्रदर्शन का एक प्रमुख घटक है।
ये परियोजनाएं, और उनके जैसी अन्य, लगातार जावास्क्रिप्ट पार्सिंग प्रदर्शन की सीमाओं को आगे बढ़ा रही हैं। बाइनरी एएसटी और वृद्धिशील प्रसंस्करण की ओर बढ़ना उनमें से कई के लिए एक स्वाभाविक विकास है। हम देख सकते हैं:
- नई लाइब्रेरी: जावास्क्रिप्ट के लिए स्ट्रीमिंग बाइनरी एएसटी पार्सिंग पर केंद्रित समर्पित लाइब्रेरी।
- उन्नत मौजूदा उपकरण: प्रमुख बंडलर और ट्रांसपाइलर इन तकनीकों को सीधे अपनी मुख्य कार्यक्षमता में शामिल कर रहे हैं।
- एब्स्ट्रैक्टेड एपीआई: मानकीकृत एपीआई जो विभिन्न पार्सिंग इंजनों को स्वैप करने की अनुमति देते हैं, जिससे अंतर-संचालनीयता को बढ़ावा मिलता है।
डेवलपर्स कैसे तैयारी कर सकते हैं और लाभ उठा सकते हैं
जबकि जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर्स का व्यापक रूप से अपनाया जाना एक सतत प्रक्रिया है, डेवलपर्स पहले से ही लाभ उठाने के लिए खुद को तैयार कर सकते हैं:
- सूचित रहें: वाइट, esbuild, और एसडब्ल्यूसी जैसे उपकरणों में विकास के साथ अद्यतित रहें। ये अक्सर नई प्रदर्शन-बढ़ाने वाली तकनीकों के शुरुआती अपनाने वाले और प्रदर्शन के रूप में काम करते हैं।
- आधुनिक टूलिंग को अपनाएं: नई परियोजनाएं शुरू करते समय, बिल्ड टूल्स और फ्रेमवर्क का उपयोग करने पर विचार करें जो प्रदर्शन और आधुनिक मॉड्यूल सिस्टम (जैसे ईएस मॉड्यूल) को प्राथमिकता देते हैं।
- अपने कोडबेस को अनुकूलित करें: तेज टूलिंग के साथ भी, स्वच्छ, मॉड्यूलर और अच्छी तरह से संरचित कोड हमेशा बेहतर प्रदर्शन करेगा।
- ओपन सोर्स में योगदान करें: यदि आपके पास विशेषज्ञता है, तो जावास्क्रिप्ट टूलिंग इकोसिस्टम में उन परियोजनाओं में योगदान करने पर विचार करें जो पार्सिंग प्रदर्शन पर केंद्रित हैं।
- अवधारणाओं को समझें: एएसटी, पार्सिंग, और स्ट्रीमिंग और वृद्धिशील प्रसंस्करण के सिद्धांतों से खुद को परिचित करें। यह ज्ञान अमूल्य होगा जैसे-जैसे ये प्रौद्योगिकियां परिपक्व होंगी।
निष्कर्ष
जावास्क्रिप्ट बाइनरी एएसटी स्ट्रीमिंग पार्सर हमारे द्वारा जावास्क्रिप्ट कोड को संसाधित और हेरफेर करने के तरीके में एक महत्वपूर्ण छलांग का प्रतिनिधित्व करता है। बाइनरी प्रतिनिधित्व की दक्षता को वृद्धिशील पार्सिंग की बुद्धिमत्ता के साथ जोड़कर, यह तकनीक हमारे विकास वर्कफ़्लो में प्रदर्शन और प्रतिक्रियाशीलता के अभूतपूर्व स्तरों को अनलॉक करने का वादा करती है। जैसे-जैसे इकोसिस्टम परिपक्व होता है, हम तेज बिल्ड, अधिक गतिशील विकास अनुभव और अधिक परिष्कृत टूलिंग की उम्मीद कर सकते हैं, जो अंततः दुनिया भर के डेवलपर्स को बेहतर एप्लिकेशन, अधिक कुशलता से बनाने के लिए सशक्त बनाएगा।
यह केवल एक विशिष्ट अनुकूलन नहीं है; यह एक मौलिक बदलाव है जो दुनिया भर के लाखों डेवलपर्स के जावास्क्रिप्ट कोड लिखने और तैनात करने के तरीके को प्रभावित करेगा। जावास्क्रिप्ट विकास का भविष्य वृद्धिशील, स्ट्रीम किया हुआ और बाइनरी है।